﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Libreria.DAL;

namespace Libreria.RFID.Modelo
{
    [CAD(true, CAD.TiposBD._SQLServer)]
    public class Persona
    {
        // Atributo de abstracción
        private MOR accesoADatos;

        private Int32? codigo;
        private Int32? tipoDeDocumento;
        private String numeroDeDocumento;
        private String nombre;
        private String apellido;
        private Int32? genero;
        private DateTime fechaDeNacimiento;
        private String direccion;
        private String telefono;
        private String correoElectronico;
        private Int32? estado;

        // Constructor de la clase
        public Persona()
        {
        }

        public Persona(string cadenaDeConexion)
        {
            this.accesoADatos = MOR.Instance(cadenaDeConexion);
        }

        //Encapsulamiento y mapeo de atributos
        [Tipo(Tipo.TiposSQLServer._int, "codigoPersona", true, true)]
        public Int32? Codigo
        {
            get { return codigo; }
            set { codigo = value; }
        }

        [Tipo(Tipo.TiposSQLServer._int, "codigoTipoDocumento")]
        public Int32? TipoDeDocumento
        {
            get { return tipoDeDocumento; }
            set { tipoDeDocumento = value; }
        }

        [Tipo(Tipo.TiposSQLServer._varchar, "numeroDocumento")]
        public String NumeroDeDocumento
        {
            get { return numeroDeDocumento; }
            set { numeroDeDocumento = value; }
        }

        [Tipo(Tipo.TiposSQLServer._varchar)]
        public String Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }

        [Tipo(Tipo.TiposSQLServer._varchar)]
        public String Apellido
        {
            get { return apellido; }
            set { apellido = value; }
        }

        [Tipo(Tipo.TiposSQLServer._int, "codigoGenero")]
        public Int32? Genero
        {
            get { return genero; }
            set { genero = value; }
        }

        [Tipo(Tipo.TiposSQLServer._datetime, "fechaNacimiento")]
        public DateTime FechaDeNacimiento
        {
            get { return fechaDeNacimiento; }
            set { fechaDeNacimiento = value; }
        }

        [Tipo(Tipo.TiposSQLServer._varchar)]
        public String Direccion
        {
            get { return direccion; }
            set { direccion = value; }
        }

        [Tipo(Tipo.TiposSQLServer._varchar)]
        public String Telefono
        {
            get { return telefono; }
            set { telefono = value; }
        }

        [Tipo(Tipo.TiposSQLServer._varchar)]
        public String CorreoElectronico
        {
            get { return correoElectronico; }
            set { correoElectronico = value; }
        }

        [Tipo(Tipo.TiposSQLServer._int, "codigoEstado")]
        public Int32? Estado
        {
            get { return estado; }
            set { estado = value; }
        }

        // Métodos de abstracción de datos
        public void crear()
        {
            this.Codigo = this.accesoADatos.crearRegistro(this);
        }

        public List<Persona> consultar()
        {
            List<Object> registros = this.accesoADatos.consultarRegistros(this, false);
            List<Persona> resultado = new List<Persona>();
            foreach (Object registro in registros)
            {
                resultado.Add((Persona)registro);
            }
            return resultado;
        }

        public Persona consultarPorCodigo(Int32 codigo)
        {
            this.Codigo = codigo;
            List<Object> registros = this.accesoADatos.consultarRegistros(this, true);
            Persona resultado = null;
            if (registros != null)
            {
                if (registros.Count == 1)
                {
                    resultado = (Persona)registros[0];
                }
            }
            return resultado;
        }

        public void actualizar()
        {
            this.accesoADatos.actualizarRegistroConNulos(this);
        }

        public void eliminar()
        {
            this.accesoADatos.borrarRegistro(this);
        }

    }
}
